#include <iostream>
#include <pthread.h>
#include <cassert>
#include <unistd.h>
#include <vector>
#include <string>
#include <thread>
#include <string>
#include <cstring>
using namespace std;   
// void thread_run()
// {
//     while(1)
//     {
//         cout<<"我是新线程"<<endl;
//         sleep(1);
//     }
// }
// int main()
// {
//     std:thread td(thread_run);
//     while(1)
//     {
//         cout<<"我是主线程"<<endl;
//         sleep(1);
//     }
//     td.join();
//     return 0;
// }





// class ThreadData
// {
// public:
//     pthread_t tid;
//     char namebuffer[64];
// };
// void* start_routine(void* args)//新线程
// {
//     ThreadData* td=static_cast<ThreadData*> (args);//安全的进行强制类型转换
//     int cnt=10;
//     while(cnt--)
//     {
//         cout<<td->namebuffer<<endl;
//         sleep(1); 
//     }
//     //pthread_exit(nullptr);
//     return nullptr;//线程函数结束，return的时候线程就算终止了
// }

// int main()
// {
//     //创建一批线程，先定义一个对象数组
//     vector<ThreadData*> threads;
//     #define NUM 10//定义创建10个线程
//     //循环创建NUM个线程
//     for(int i=0;i<NUM;++i)
//     {
//         ThreadData* td=new ThreadData();
//         snprintf(td->namebuffer,sizeof(td->namebuffer),"%s%d","thread",i);
//         pthread_create(&td->tid,nullptr,start_routine,td);//传递new出来对象的地址，就不会出现缓冲区冲突的问题
//         threads.push_back(td);
//         //pthread_create(&tid,nullptr,start_routine,(void*)"newThread");
//         //pthread_create(&tid,nullptr,start_routine,namebuffer);//传的是缓冲区的地址，所有线程均可访问这段空间
//                                                               //这段堆空间虽然出作用域销毁，但是每个线程的缓冲区都是这个地址
//         //sleep(1);//不睡眠的话，线程缓冲区会被其他进程刷新
//     }
//     sleep(5);
//     for(auto& iter : threads)
//     {
//         pthread_cancel(iter->tid);
//     }
//     for(auto& iter : threads)
//     {
//         void* ret=nullptr;
//         int n=pthread_join(iter->tid,&ret);//用ret取到返回值void*
//         assert(0==n);
//         cout<<"退出成功"<<(long long)ret<<endl;
//         delete iter;
//     }
//     cout<<"主函数退出"<<endl;

    
//     // pthread_t tid;
//     // int n=pthread_create(&tid,nullptr,start_routine,(void*)"newThread");
//     // //主线程
//     // assert(0==n);
//     // (void)n;
//     // while(1)
//     // {
//     //     cout<<"mainThread"<<endl;
//     //     sleep(1); 
//     // }
//     return 0;
// }



// void* start_routine(void* args)
// {
//     string threadname=static_cast<const char*>(args);
//     sleep(5);
//     return nullptr;
// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,start_routine,(void*)"thread 1");
//     pthread_detach(tid);//创建线程成功时，由主线程进行分离

//     // int n=pthread_join(tid,nullptr);
//     // cout<<n<<":"<<strerror(n)<<endl;
//     return 0;
// }









int tickets=10000; 
void* thread_run(void* args)
{ 
    string threadName=static_cast<const char*>(args);
    while(1)
    {
        if(tickets>0)
        {
            usleep(1000);
            cout<<"新线程"<<threadName<<"->"<<tickets--<<endl;
            //usleep(1000);
        }
    }
}
int main()
{
    unique_ptr<Thread> thread1(new Thread(thread_run,(void*)"thred1",1));
    unique_ptr<Thread> thread2(new Thread(thread_run,(void*)"thred2",2));
    unique_ptr<Thread> thread3(new Thread(thread_run,(void*)"thred3",3));
  
    thread1->join();
    thread2->join();
    thread3->join();
    return 0;
}